/**
 * 格式化工具模块
 * @description 导出所有格式化相关的工具函数和类
 */

// 导出字符串格式化工具
export { StringUtils } from './stringUtils';
export {
  truncate,
  capitalize,
  generateUniqueId,
  formatFileSize as formatFileSizeString,
  formatPhone,
  highlightKeyword,
  isEmpty,
  isNotEmpty,
  formatTemplate
} from './stringUtils';

// 导出数字格式化工具
export { NumberUtils } from './numberUtils';
export {
  formatCurrency,
  formatPercentage,
  formatThousands,
  formatCompact,
  formatDuration,
  formatRating,
  formatProgress,
  formatRange,
  safeAdd,
  safeSubtract,
  safeMultiply,
  safeDivide,
  isInRange,
  clamp
} from './numberUtils';

// 导出时间和课程状态格式化函数
import { 
  DayOfWeekEnum, 
  ScheduleTemplateStatusEnum, 
  ScheduleInstanceStatusEnum,
  DayOfWeekText,
  DayOfWeekShortText,
  ScheduleTemplateStatusText,
  ScheduleInstanceStatusText
} from '@/types/schedule/enums';

import { 
  StudentStatusEnum,
  StudentStatusText 
} from '@/types/student/enums';

import { 
  CourseStatusEnum,
  CourseStatusText 
} from '@/types/course/enums';

/**
 * 时间显示格式化工具类
 */
export class TimeDisplayFormatter {
  /**
   * 格式化时间段显示
   * @param startTime 开始时间
   * @param endTime 结束时间
   * @returns 格式化的时间段字符串
   */
  static formatTimeRange(startTime: string, endTime: string): string {
    if (!startTime || !endTime) {
      return '';
    }
    return `${startTime} - ${endTime}`;
  }

  /**
   * 格式化星期几显示
   * @param dayOfWeek 星期几枚举值
   * @param short 是否使用简称
   * @returns 星期几的中文显示
   */
  static formatDayOfWeek(dayOfWeek: DayOfWeekEnum, short: boolean = false): string {
    const textMap = short ? DayOfWeekShortText : DayOfWeekText;
    return textMap[dayOfWeek] || '';
  }

  /**
   * 格式化课程时长显示
   * @param startTime 开始时间
   * @param endTime 结束时间
   * @returns 课程时长字符串
   */
  static formatCourseDuration(startTime: string, endTime: string): string {
    if (!startTime || !endTime) {
      return '';
    }

    const [startHour, startMinute] = startTime.split(':').map(Number);
    const [endHour, endMinute] = endTime.split(':').map(Number);
    
    const startMinutes = startHour * 60 + startMinute;
    const endMinutes = endHour * 60 + endMinute;
    const durationMinutes = endMinutes - startMinutes;

    if (durationMinutes <= 0) {
      return '';
    }

    const hours = Math.floor(durationMinutes / 60);
    const minutes = durationMinutes % 60;

    if (hours === 0) {
      return `${minutes}分钟`;
    } else if (minutes === 0) {
      return `${hours}小时`;
    } else {
      return `${hours}小时${minutes}分钟`;
    }
  }

  /**
   * 格式化课程次数显示
   * @param completedCount 已完成次数
   * @param totalCount 总次数
   * @returns 次数显示字符串
   */
  static formatSessionCount(completedCount: number, totalCount: number): string {
    if (typeof completedCount !== 'number' || typeof totalCount !== 'number') {
      return '';
    }
    return `${completedCount}/${totalCount}`;
  }

  /**
   * 格式化剩余次数显示
   * @param completedCount 已完成次数
   * @param totalCount 总次数
   * @returns 剩余次数字符串
   */
  static formatRemainingCount(completedCount: number, totalCount: number): string {
    if (typeof completedCount !== 'number' || typeof totalCount !== 'number') {
      return '';
    }
    const remaining = totalCount - completedCount;
    return remaining > 0 ? `剩余${remaining}次` : '已完成';
  }
}

/**
 * 课程状态格式化工具类
 */
export class StatusFormatter {
  /**
   * 格式化学生状态显示
   * @param status 学生状态枚举值
   * @returns 状态的中文显示
   */
  static formatStudentStatus(status: StudentStatusEnum): string {
    return StudentStatusText[status] || '';
  }

  /**
   * 格式化课程状态显示
   * @param status 课程状态枚举值
   * @returns 状态的中文显示
   */
  static formatCourseStatus(status: CourseStatusEnum): string {
    return CourseStatusText[status] || '';
  }

  /**
   * 格式化课程模板状态显示
   * @param status 课程模板状态枚举值
   * @returns 状态的中文显示
   */
  static formatScheduleTemplateStatus(status: ScheduleTemplateStatusEnum): string {
    return ScheduleTemplateStatusText[status] || '';
  }

  /**
   * 格式化课程实例状态显示
   * @param status 课程实例状态枚举值
   * @returns 状态的中文显示
   */
  static formatScheduleInstanceStatus(status: ScheduleInstanceStatusEnum): string {
    return ScheduleInstanceStatusText[status] || '';
  }

  /**
   * 获取状态对应的颜色类型
   * @param status 状态值
   * @param statusType 状态类型
   * @returns Ant Design 的状态颜色类型
   */
  static getStatusColor(
    status: StudentStatusEnum | CourseStatusEnum | ScheduleTemplateStatusEnum | ScheduleInstanceStatusEnum,
    statusType: 'student' | 'course' | 'template' | 'instance'
  ): 'success' | 'processing' | 'error' | 'warning' | 'default' {
    switch (statusType) {
      case 'student':
        switch (status as StudentStatusEnum) {
          case 1: return 'success';    // 在读
          case 2: return 'warning';    // 休学
          case 3: return 'default';    // 毕业
          case 4: return 'error';      // 已删除
          default: return 'default';
        }
      case 'course':
        switch (status as CourseStatusEnum) {
          case 1: return 'success';    // 正常
          case 2: return 'warning';    // 暂停
          case 3: return 'error';      // 已删除
          default: return 'default';
        }
      case 'template':
        switch (status as ScheduleTemplateStatusEnum) {
          case 1: return 'processing'; // 进行中
          case 2: return 'success';    // 已完成
          case 3: return 'warning';    // 暂停
          case 4: return 'error';      // 已取消
          case 5: return 'default';    // 已删除
          default: return 'default';
        }
      case 'instance':
        switch (status as ScheduleInstanceStatusEnum) {
          case 1: return 'default';    // 已安排
          case 2: return 'success';    // 已完成
          case 3: return 'error';      // 已取消
          case 4: return 'warning';    // 补课
          case 5: return 'default';    // 已删除
          default: return 'default';
        }
      default:
        return 'default';
    }
  }
}



/**
 * 导出便捷格式化函数
 */

/**
 * 格式化时间段
 */
export const formatTimeRange = (startTime: string, endTime: string) => 
  TimeDisplayFormatter.formatTimeRange(startTime, endTime);

/**
 * 格式化星期几
 */
export const formatDayOfWeek = (dayOfWeek: DayOfWeekEnum, short?: boolean) => 
  TimeDisplayFormatter.formatDayOfWeek(dayOfWeek, short);

/**
 * 格式化课程时长
 */
export const formatCourseDuration = (startTime: string, endTime: string) => 
  TimeDisplayFormatter.formatCourseDuration(startTime, endTime);

/**
 * 格式化课程次数
 */
export const formatSessionCount = (completedCount: number, totalCount: number) => 
  TimeDisplayFormatter.formatSessionCount(completedCount, totalCount);

/**
 * 格式化剩余次数
 */
export const formatRemainingCount = (completedCount: number, totalCount: number) => 
  TimeDisplayFormatter.formatRemainingCount(completedCount, totalCount);

/**
 * 格式化学生状态
 */
export const formatStudentStatus = (status: StudentStatusEnum) => 
  StatusFormatter.formatStudentStatus(status);

/**
 * 格式化课程状态
 */
export const formatCourseStatus = (status: CourseStatusEnum) => 
  StatusFormatter.formatCourseStatus(status);

/**
 * 格式化课程模板状态
 */
export const formatScheduleTemplateStatus = (status: ScheduleTemplateStatusEnum) => 
  StatusFormatter.formatScheduleTemplateStatus(status);

/**
 * 格式化课程实例状态
 */
export const formatScheduleInstanceStatus = (status: ScheduleInstanceStatusEnum) => 
  StatusFormatter.formatScheduleInstanceStatus(status);

/**
 * 获取状态颜色
 */
export const getStatusColor = (
  status: StudentStatusEnum | CourseStatusEnum | ScheduleTemplateStatusEnum | ScheduleInstanceStatusEnum,
  statusType: 'student' | 'course' | 'template' | 'instance'
) => StatusFormatter.getStatusColor(status, statusType);